# 创建集合set,set()用来创建集合函数，type()用来查看数据类型
# 1,可以使用大括号来进行创建
s = {1, 2, 3, 4}
# 2, 使用set()函数来进行创建
ss = set('1234')
print(type(s))
print(type(ss))
# 集合的添加和删除
# 添加元素
s.add(6)
print(s)
# 删除集合中第一个元素
s.pop()
print(s)
# 删除集合中的元素
s.remove(4)
print(s)
# # 创建元组
# 创建空元组
tuple1 = ()
print(tuple1)
# 创建带有元素的元组. 可以有元素类型
tuple2 = (1, "a", 3, "hello", 2.2)
print(tuple2)
# 创建只有一个元素的元组
tuple3 = (1,)
print(type(tuple3))

# # 使用tuple()函数将其它数据类型转换为元组类型。
# 语法格式:tuple(数据)
# 将字符串转换成元组
tuple1 = tuple('hello,world')
print(tuple1)
# 将列表转换成元组
list1 = ['Python', 'Java', 'C++', 'C']
tuple2 = tuple(list1)
print(tuple2)
# 从开始索引开始截取，截止到结束索引之前.
tuple1 = ('h', 'e', 'l', 'l', 'o')
# # 使用索引访元组中的某个元素
# 使用正数索引,从0 开始
print(tuple1[2])
# 使用负数索引，倒序从-1开始
print(tuple1[-4])

# # 使用切片访问元组中的一组元素,前闭后开
# 使用正数切片
print(tuple1[1: 4])
# 指定步长
print(tuple1[1: 4: 2])
# 使用负数切片
print(tuple1[-5: -1])
# # 删除元素
l15 = ['a', 'b', 'c', 'd']
l15.remove('a')
print(l15)
# 如果元素不在列表中，删除元素时会报错
# l15.remove('f')

# pop( )方法用来删除列表中指定索引处的元素
l16 = [1, 2, 4, 8, 16, 32]
# 删除索引为3的元素
l16.pop(8)
print(l16)
# 删除最后一个元素
l16.pop()
print(l16)

# del 可以用来删除列表中单个元素或者是一段连续的元素
l17 = ['a,', 'b', 'c', 'd', 'e']
# 删除索引为1的元素
del l17[1]
print(l17)
l18 = [13, 89, 65, 95, 7]
# 删除索引为1—3的元素
del l18[1:4]
print(l18)

# 若将列表中所有的元素全部删除，可使用列表的clear() 方法
l19 = ['a', 'b', 'c', 'a']
# 清空列表
l19.clear()
print(l19)


# 任务
# 创建两个空列表name_list和phone_list，用于存储联系人姓名和电话；
# 向列表中添加联系人信息
# 输入联系人编号修改信息
# 输入联系人编号删除信息
# # 使用clear()清空通讯录
name_list = []
phone_list = []
while 1:
    print("菜单: 1.添加联系人 2.修改联系人 3.删除联系人 ")
    chioce = input("请输入选择: ")
    # 1.添加联系人，包括姓名，手机号
    if chioce == "1":
        name_list.append(input("请输入联系人姓名"))
        phone_list.append(input("请输入联系人手机号"))
        print(name_list)
        print(phone_list)
    # 2.修改联系人信息
    elif chioce == "2":
        num = int(input("请输入联系人编号"))
        if len(name_list) > 0 and num <= len(name_list):
            name_list[num - 1] = input("修改联系人姓名")
            phone_list[num - 1] = input("修改联系电话")
        else:
            print("联系人编号输入有误")
# 查找元素 index( ) 列表.index[要查找的元素，索引起始位置，索引结束位置]
ls1 = [2, 3, 5, 9, 7, 'a', 0, 'b', 'a', 'b', 3]
print(ls1.index(3))
print(ls1.index('b', 6, 9))
print(ls1.index('a', 7))

# # count( ) 方法用来统计某个元素在列表中出现的次数 列表名.count(统计的value元素)
ls2 = [1, 3, 5, 7, 'a', 'b', 8, 3 ,'b', 2, 5, 5, 7, 1]
print(ls2.count(5))
print(ls2.count(0))
print(ls2.count('b'))
# # 元素排序 sort( )函数用于对原列表进行排序，如果指定参数，则使用指定的比较函数，
# # 语法格式为: ls.sort(key=None, reverse=False)
# # 1, 元素是字符串的排序
ls3 = ['1', '3', '44', '23', '99', '88', '56', '233']
# 默认升序
ls3.sort()
print(ls3)
# 降序 reverse=True
ls3.sort(reverse=True)
print(ls3)

ls3 = [1, 3, 44, 23, 99, 88, 56, 233]
# 默认升序
ls3.sort()
print(ls3)
# 降序 reverse=True
ls3.sort(reverse=True)
print(ls3)


""""字典"""
# 字典的创建
# 1, 使用{ } 创建字典语法格式:
# 字典名 = {‘key1':'value1', 'key2':'value2', ..., 'keyn':valuen}
# 使用字符串作为key
d1 = {'python': 90, "可视化": 89,"英语": 85}
print(type(d1))
# 使用元组和数字作为key
d2 = {(23, 89): "great", 30:[1, 3, 4]}
print(type(d2))
# 创建空元组
d3 = {}
print(d3)


# 2, 用dict () 方法通过关键字的参数来创建字典格式:
# 字典名= dict(key1=value1, key2=value2, key3=value3)
d4 = dict(数学=98, 语文=87, 英语= 89)
print(d4)
# 修改元组元素
tuple1 = (12, 34, 56)
tuple2 = ('abc,', 'mn')
# 修改元组元素操作是非法的
# tuple1[0] = 100
# tuple1[0] = 200
# 链接元组创建一个新的元组，两个数据必须都是元组
tuple3 = tuple1 + tuple2
print(tuple3)

# del删除元组
del tuple1


# # 使用input方法输入联系人姓名,电话,邮件,地址；
# # 定义元组tuple1存储上述信息
# # 输出tuple1,查看联系人信息
n = input('请输入联系人姓名')
t = input('请输入13位手机号')
e = input('请输入邮箱地址')
a = input('请输入联系地址')
tuple1 = ("姓名:", n, "电话: ", t, "邮箱: ", e, "地址: ", a)
print(tuple1)

"""列表list"""
# 列表的创建
# 1.使用 [ ] 直接创建列表:
list1 = [1, "hello", 2, "C语言"]
print(list1)
print(type(list1))
# 创建一个空列表
list2 = []
print(list2)


# 1 转化字符串
l3 = list("hello")
print(l3)

# 2,转化元组
t1 = tuple("hello")
l4 = list(t1)
print(l4)


# 3,转化range函数
r1 = range(5)   # 0, 1, 2, 3, 4
print(r1)
l5 = list(r1)
print(l5)

# # 访问列表中的元素
l1 = [1, 2, 3, '8', 'p', 'u']
# 使用正数索引进行访问，访问p
print(l1[4])
# 使用负向索引进行访问p
print(l1[-2])

#
# 使用切片形式访问列表中的元素
l2 = ['p', 'u', 'w', 'r', 1, 5, 7]
# 正向取值
# 使用切片取出索引2， 3， 4的元素
print(l2[2:5])
# 正切片取前三个元素
print(l2[:3])
# 正切片后前三个元素
print(l2[4:])
# 使用切片，取索1-5的元素，步长为2
print(l2[1:6:2])
# 负向取值
# 使用负切片形式取出u,w,r
print(l2[-6:-3])
# 步长为负数的话，取值从右到左，常用在排序上边，倒序形式
print(l2[::-1])
l3 = [10, 8, 6, 5, 2, 1]
print(l3[::-1])
# # 遍历列表
# list1 = ['python', 'java', 'c']
# # 使用for循环遍历列表
# for item in list1:
#       print(item)
l3 = ['python', 'java', 'c', 'c++', 'r', 'go', 'javascriput']
for i in l3:
    print(i)

# # 修改列表元素
# # 修改单个元素
l4 = [10, 56, 34, 2, 56, 44, 7]
# # 将索引为2的元素值修改为100
l4[2] = 100
print(l4)
#
# # 修改多个元素
l5 = [10, 56, 34, 2, 56, 44, 7]
# # 修改第 1~4 个元素的值（不包括第4个元素）
l5[1: 4] = [45, -56, 98]
print(l5)

# # 列表中添加元素
# # 1，append()用于在列表的末尾追加元素
l6 = ['a', 'b', 'c']
l6.append('f')
print(l6)
# # # 列表添加列表
l6.append(['e', 'f'])
print(l6)


# # 2,extend(  )在列表的末尾一次添加多个元素
l7 = ['a', 'b', 'c']
l7.extend('d')
print(l7)
# # 列表添加列表
l7.extend(['e', 'f', 'g', 'h'])
print(l7)
l7,extend('world')
print(l7)
#
# # 3,insert()在列表的特定位置添加想要的特定元素
l8 = ['python', 'c', 'java']
# # 插入元素，在索引为1处插入c++
l8,insert(2, 'go')
# l8,insert(1, 'c++')
print(l8)
# # 字典元素的访问
# 1, 字典名[key]
d5 = {'数学': 95, '英语': 92, '语文': 84}
# 键存在，返回的是值value
print(d5['英语'])
# 键不存在，会引发一个keyerror错误
print(d5['Python'])
#
# 2,get( ) 方法来获取指定键对应的值，语法格式；字典名.get(key[,default])
d6 = {'数学': 95, '英语':92, '语文': 84}
# 键存在
print(d6.get('语文'))
# 健存在，不写default, 会返回None
print(d6.get('python'))
print(d6.get('python', '该键不存在'))


# # 字典添加键值对
d7 = {'数学': 95, '英语':92, '语文': 84, 'Python': 99}
d7['可视化'] = 99
print(d7)



# # 字典修改键值对
d8 = {'数学': 95, '英语': 92, '语文': 84, 'Python': 99}
d8['英语'] = 100
print(d8)
#
#
# # 字典删除键值对
d9 = {'数学': 95, '英语': 92, '语文': 84, 'Python': 99}
# 1,使用del关键字
del d9['语文']
print(d9)
# 2,使用pop () 方法
d9.pop('英语')
print(d9)